#pragma once
#include "Asignar.h"
class Para :
	public Sentencia
{
public:

	Para(Sentencia *next,Asignar *asignar,Expr *expr,Sentencia *instrucciones):Sentencia(next)
	{
		this->asignar=asignar;
		this->expr = expr;
		this->instrucciones=instrucciones;
	}

	~Para(void)
	{
	}

	virtual string is(){
		return "PARA";
	}

	void setAsignar(Asignar *asignar){
		this->asignar = asignar;
	}

	void setExpr(Expr *expr){
		this->expr=expr;
	}

	void setInstrucciones(Sentencia *instrucciones){
		this->instrucciones = instrucciones;
	}

	Asignar* getAsignar(){
		return this->asignar;
	}

	Expr* getExpr(){
		return this->expr;
	}

	Sentencia* getInstrucciones(){
		return this->instrucciones;
	}

	virtual tipo_ts * validarSemantica(tabla_simbolos *tabla_de_tipo,tabla_simbolos *tabla_de_varaible){
		tipo_ts *asignar_ = this->asignar->validarSemantica(tabla_de_tipo,tabla_de_varaible);
		if(asignar_->is().compare("ENTERO")!=0){
			stringstream out;
			out<<"La Asignacion debe ser entera"<<endl;
			throw exception(out.str().c_str());
		}
		tipo_ts *expr_ = this->expr->validarSemantica(tabla_de_tipo,tabla_de_varaible);
		if(expr_->is().compare("ENTERO")!=0){
			stringstream out;
			out<<"El Final del Para debe ser entera"<<endl;
			throw exception(out.str().c_str());
		}
		if(this->instrucciones!=0){
		this->instrucciones->validarSemantica(tabla_de_tipo,tabla_de_varaible);
		}
		if(this->getNext()!=0){
		this->getNext()->SetReturn(this->GetReturn());
		this->getNext()->validarSemantica(tabla_de_tipo,tabla_de_varaible);
		}
		return 0;
	}

private: 
Asignar *asignar;
Expr *expr;
Sentencia *instrucciones;

};

